import os
from PIL import Image
import io


class imageService:

    def __init__(self, upload_folder):
        self.upload_folder = upload_folder
        # 确保上传目录存在
        if not os.path.exists(self.upload_folder):
            os.makedirs(self.upload_folder)

    def convert_to_ico(self, image_file, size):
        """
        将上传的图片转换为指定尺寸的 favicon.ico 文件
        :param image_file: 上传的图片文件
        :param size: 目标尺寸（整数，例如 32）
        :return: 转换后的 ICO 文件的二进制数据（BytesIO）
        """
        # 验证文件类型
        if not image_file.filename.lower().endswith(('.png', '.jpg', '.jpeg', '.gif', '.bmp')):
            raise ValueError('请上传图片格式文件')

        # 保存上传的图片
        image_path = os.path.join(self.upload_folder, image_file.filename)
        image_file.save(image_path)

        try:
            # 打开图片并转换为 ICO
            img = Image.open(image_path).convert('RGBA')
            img = img.resize((size, size), Image.LANCZOS)

            # 创建一个内存缓冲区来保存 ICO 文件
            output = io.BytesIO()
            img.save(output, format='ICO', sizes=[(size, size)])
            output.seek(0)

            return output
        finally:
            # 删除临时文件
            if os.path.exists(image_path):
                os.remove(image_path)

    def validate_file(self, file):
        """
        验证上传的文件是否有效
        :param file: 上传的文件
        :return: 如果有效则返回 True，否则抛出异常
        """
        if not file:
            raise ValueError('无效的文件')
        if not file.filename:
            raise ValueError('请选择文件')
        return True
